iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 15
0
Mobile Development

顏色 countenance APP製作筆記系列 第 15

[Day 15] Core Data資料存取

  • 分享至 

  • xImage
  •  

建立完Core Data的設定後,接下來要將Core Data的功能加入程式碼,今天會使用昨天創建的「DateInfo」Entity示範如何在Xcode中存取Core Data資料。

撰寫Core Data程式

參考資料:https://www.youtube.com/watch?v=gWurhFqTsPU

  1. 開啟「(專案名稱).xcworkspace」檔案,點擊想要使用功能的swift檔,於檔案最上方輸入「import CoreData」
import CoreData
  1. 設定用來操作Core Data的常數
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
  • 因為Core Data的生成相關程式碼在AppDelegate.swift中,因此以delegate(委任)的方式取用AppDelegate.swift內的物件
  • 取得AppDelegate中的persistentContainer,並使用其中的viewContext來更動Core Data的內容
  1. 輸入下列程式碼「新增」資料
let dateInfo = NSEntityDescription.insertNewObject(forEntityName: "DateInfo", into: context) as! DateInfo

dateInfo.date = "2020-9-28"
dateInfo.eventCount = Int16(3)
dateInfo.uuid = UUID()

do{
    try context.save()
    print(dateInfo)
}catch let createError{
    print("Failed to create :\(createError)")
}
  • 透過NSEntityDescription中的insertNewObject()新增Entity,「forEntityName: DateInfo」表示指定到「DateInfo」的Entity,「into: context」表示將值回傳到對應的Entity中
  • 依據「DateInfo」的Attribute設定給值
  • 使用viewContext中提供的save()函式儲存目前的資料內容

https://ithelp.ithome.com.tw/upload/images/20200929/20130458dwZ9EG2Xkf.png

  1. 輸入下列程式碼「讀取」資料
let fetchRequestRead = NSFetchRequest<DateInfo>(entityName: "DateInfo")
fetchRequestRead.fetchLimit = 1
fetchRequestRead.predicate = NSPredicate(format: "date == %@", "2020-9-28")

do{
    let dateInfoRead = try context.fetch(fetchRequestRead)
    print(dateInfoRead[0])
}catch let fetchError{
    print("Failed to fetch compaies: \(fetchError)")
}
  • 宣告NSFetchRequest的物件,並指定放入的資料為「DateInfo」的Entity
  • fetchLimit用來設定放入的資料量,設為1表示只取第一個符合條件的資料
  • predicate用來設定取資料的條件,%@格式會帶入字串內容,因此「format: "date == %@", "2020-9-28"」表示date的值為"2020-9-28"的字串
  • 使用viewContext中提供的fetch()函式取得相對應的資料
  • 因為「dateInfoRead」中只放入一筆Entity,輸入「dateInfoRead[0]」取得第一筆資料內容

https://ithelp.ithome.com.tw/upload/images/20200929/20130458oyRFRGS65Y.png

  1. 輸入下列程式碼「更新」資料
let fetchRequestUpdate = NSFetchRequest<DateInfo>(entityName: "DateInfo")
fetchRequestUpdate.fetchLimit = 1
fetchRequestUpdate.predicate = NSPredicate(format: "date == %@", "2020-9-28")

do{
    let dateInfoUpdate = try context.fetch(fetchRequestUpdate)
    dateInfoUpdate[0].eventCount = Int16(4)

    do{
        try context.save()
        print(dateInfoUpdate[0])
    } catch let createError{
        print("Failed to update: \(createError)")
    }
}catch let fetchError{
    print("Failed to fetch compaies: \(fetchError)")
}
  • 更新資料前,需要依照第4點的步驟找到要更新的資料
  • 更改完Attribute的值後,用save()函式儲存目前的資料內容

https://ithelp.ithome.com.tw/upload/images/20200929/20130458XmL4WSt3y9.png

  1. 輸入下列程式碼「刪除」資料
let fetchRequestDelete = NSFetchRequest<DateInfo>(entityName: "DateInfo")
fetchRequestDelete.fetchLimit = 1
fetchRequestDelete.predicate = NSPredicate(format: "date == %@", "2020-9-28")

do{
    let dateInfoDelete = try context.fetch(fetchRequestDelete)
    context.delete(dateInfoDelete[0])

    do{
        try context.save()
        print(dateInfoDelete[0])
    } catch let createError{
        print("Failed to update: \(createError)")
    }
}catch let fetchError{
    print("Failed to fetch compaies: \(fetchError)")
}
  • 刪除資料前,需要依照第4點的步驟找到要刪除的資料
  • 使用viewContext中提供的delete()函式刪除資料
  • 用save()函式儲存目前的資料內容

https://ithelp.ithome.com.tw/upload/images/20200929/20130458ASA6k7rncW.jpg

除了上述介紹的基本資料存取外,Core Data還有很多其他好用的功能,大家可以依據自己的App使用相對應的存取方式,也歡迎在下方留言和我討論。
「顏色」App的資料庫筆記到這邊告一段落,接下來會和大家分享前端各種介面的製作方式!


上一篇
[Day 14] Core Data設定
下一篇
[Day 16] 用程式產生Collection View(上) 基本設定
系列文
顏色 countenance APP製作筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言